package com.serviportales.serviquality.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.serviportales.serviportales.dao.GenericHibernateDAO;
import com.serviportales.serviportales.exceptions.DAOException;
import com.serviportales.serviportales.utils.BeansUtils;
import com.serviportales.serviquality.model.Proyecto;
import com.serviportales.serviquality.model.ProyectoNodo;

@Repository
public class ProyectoNodoDAO extends GenericHibernateDAO<ProyectoNodo> {

	private static final long serialVersionUID = 1L;

	@Override
	public DetachedCriteria getBasicDetachedCriteria(ProyectoNodo proyectoNodo) throws DAOException {
		try {
			DetachedCriteria criteria = DetachedCriteria.forClass(ProyectoNodo.class);

			// Proyecto
			if (BeansUtils.getDatoAtributo(proyectoNodo, "proyectoNodoPK.proyecto.codigo") != null) {
				criteria.add(Restrictions.eq("proyectoNodoPK.proyecto.codigo", proyectoNodo.getProyectoNodoPK().getProyecto().getCodigo()));
			}
			// Parent
			if (BeansUtils.getDatoAtributo(proyectoNodo, "parent.proyectoNodoPK.proyecto.codigo") != null) {
				criteria.add(Restrictions.eq("parent.proyectoNodoPK.proyecto.codigo", proyectoNodo.getParent().getProyectoNodoPK().getProyecto().getCodigo()));
			}
			if (BeansUtils.getDatoAtributo(proyectoNodo, "parent.proyectoNodoPK.nodo.nodoPK.codigo") != null) {
				criteria.add(Restrictions.eq("parent.proyectoNodoPK.nodo.nodoPK.codigo", proyectoNodo.getParent().getProyectoNodoPK().getNodo().getNodoPK().getCodigo()));
			}
			if (BeansUtils.getDatoAtributo(proyectoNodo, "parent.proyectoNodoPK.nodo.nodoPK.tipoNodo.codigo") != null) {
				criteria.add(Restrictions.eq("parent.proyectoNodoPK.nodo.nodoPK.tipoNodo.codigo", proyectoNodo.getParent().getProyectoNodoPK().getNodo().getNodoPK().getTipoNodo().getCodigo()));
			}

			return criteria;
		} catch (Exception e) {
			throw new DAOException(e.getMessage(), e);
		}

	}

	public ProyectoNodo selectByID(Serializable codigo) {
		return getHibernateTemplate().get(ProyectoNodo.class, codigo);
	}

	@SuppressWarnings("unchecked")
	public List<ProyectoNodo> selectChildren(ProyectoNodo proyectoNodo) {
		String strQuery = "from ProyectoNodo as proyectoNodo " + //
				"left join fetch proyectoNodo.parent " + //
				"left join fetch proyectoNodo.parent.proyectoNodoPK.proyecto " + //
				"left join fetch proyectoNodo.parent.proyectoNodoPK.nodo " + //
				"left join fetch proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch proyectoNodo.proyectoNodoPK.proyecto " + //
				"join fetch proyectoNodo.proyectoNodoPK.nodo " + //
				"join fetch proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"where proyectoNodo.proyectoNodoPK.proyecto.codigo = :cdProyecto ";
		if (proyectoNodo.getProyectoNodoPK().getNodo() == null) {
			strQuery += "and (proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.codigo is null) ";
		} else {
			strQuery += "and (proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.codigo = :cdNodo) " + //
					"and (proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.tipoNodo.codigo = :cdTipoNodo) ";
		}

		Query query = getSession().createQuery(strQuery);
		query.setString("cdProyecto", proyectoNodo.getProyectoNodoPK().getProyecto().getCodigo());
		if (proyectoNodo.getProyectoNodoPK().getNodo() != null) {
			query.setString("cdNodo", proyectoNodo.getProyectoNodoPK().getNodo().getNodoPK().getCodigo());
			query.setString("cdTipoNodo", proyectoNodo.getProyectoNodoPK().getNodo().getNodoPK().getTipoNodo().getCodigo());
		}

		return query.list();
	}

	@SuppressWarnings("unchecked")
	public List<ProyectoNodo> selectCreateTree(Proyecto proyecto) {
		String strQuery = "from ProyectoNodo as proyectoNodo " + //
				"left join fetch proyectoNodo.parent " + //
				"left join fetch proyectoNodo.parent.proyectoNodoPK.proyecto " + //
				"left join fetch proyectoNodo.parent.proyectoNodoPK.nodo " + //
				"left join fetch proyectoNodo.parent.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"join fetch proyectoNodo.proyectoNodoPK.proyecto " + //
				"join fetch proyectoNodo.proyectoNodoPK.nodo " + //
				"join fetch proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo " + //
				"where proyectoNodo.proyectoNodoPK.proyecto.codigo = :codigo " + //
				"order by proyectoNodo.proyectoNodoPK.nodo.nodoPK.tipoNodo.nivel";
		Query query = getSession().createQuery(strQuery);
		query.setProperties(proyecto);
		return query.list();
	}
}
